package it.agm.fanta.fragment;

import it.agm.fanta.FantaserviceApp;
import it.agm.fanta.R;
import it.agm.fanta.adapter.GiocatoriPartitaLegaAdapter;
import it.agm.fanta.model.Giocatore;
import it.agm.fanta.model.GiocatorePartitaLega;
import it.agm.fanta.model.Partita;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

/**
 * Fragment che contiene la lista delle news, il pulsante per accedere al
 * libretto, quello per accedere alla lista di appelli e quello per i risultati
 */
@SuppressLint("ValidFragment")
public class PartitaLegaFragment extends Fragment {
	private static final int MAX_SOSTITUZIONI = 3;
	boolean trasferta = false;
	private String mTitle;
	private GiocatoriPartitaLegaAdapter adapter;
	
	
	public String getTitle() {
		if (FantaserviceApp.partiteLegaCorrente != null) {
			if (trasferta) {
				mTitle = FantaserviceApp.partiteLegaCorrente
						.getSquadratrasferta()
						+ " - "
						+ FantaserviceApp.partiteLegaCorrente
								.getGolsquadratrasferta()
						+ "("
						+ FantaserviceApp.partiteLegaCorrente
								.getPunteggiosquadratrasferta() + ")";
			} else {
				mTitle = FantaserviceApp.partiteLegaCorrente.getSquadracasa()
						+ " - "
						+ FantaserviceApp.partiteLegaCorrente
								.getGolsquadracasa()
						+ "("
						+ FantaserviceApp.partiteLegaCorrente
								.getPunteggiosquadracasa() + ")";
			}
		}
		return mTitle;
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		View rootView = inflater.inflate(R.layout.fragment_partita_lega_dettails, container,false);
		if(FantaserviceApp.giocatorePartitaLega != null && FantaserviceApp.giocatorePartitaLega.size()>0){
			updateData(rootView);
		}
		return rootView;
	}

	/**
	 * @param rootView
	 */
	public void updateData(View rootView) {
			ListView listViewGiocatoriPartitaLegaTab = (ListView) rootView.findViewById(R.id.listGiocatoriPartitaLegaTab);
			ArrayList<GiocatorePartitaLega> list = refrashLista();
			adapter = new GiocatoriPartitaLegaAdapter(getActivity(), R.layout.row_calciatore_partita_lega,list);
			listViewGiocatoriPartitaLegaTab.setAdapter(adapter);
	}

	/**
	 * @return
	 */
	public ArrayList<GiocatorePartitaLega> refrashLista() {
		int gol = 0;
		String punteggio ="";
		String squadra="";
		ArrayList<GiocatorePartitaLega> list = new ArrayList<GiocatorePartitaLega>();
		ArrayList<GiocatorePartitaLega> listRiserve = new ArrayList<GiocatorePartitaLega>();	
		List<Partita> livePartite = new  ArrayList<Partita>();
		if(FantaserviceApp.request.isCoppa()){
			livePartite = FantaserviceApp.partiteCoppa.getPartite();
		}else{
			livePartite = FantaserviceApp.partite.getPartite();
		}
		long idPartita = FantaserviceApp.giocatorePartitaLega.get(0).getIdpartitalega();
		
		for(Partita partita :livePartite){
			if(partita.getIdpartitalega() == idPartita){
				if(!partita.getPunteggiosquadracasa().equals("0")){
					FantaserviceApp.partitaGiocata = true;
				}
				if(trasferta){
					squadra = partita.getSquadratrasferta();
					gol = partita.getGolsquadratrasferta();
					punteggio = partita.getPunteggiosquadratrasferta();
				}else{
					squadra = partita.getSquadracasa();
					gol = partita.getGolsquadracasa();
					punteggio = partita.getPunteggiosquadracasa();
				}
				mTitle = squadra +" - " + gol +"(" + punteggio+")";
				
				for(GiocatorePartitaLega giocatore : FantaserviceApp.giocatorePartitaLega){
					if(squadra.equals(giocatore.getSquadra())){
						if(GiocatorePartitaLega.TITOLARE.equals(giocatore.getLineup())){
							list.add(giocatore);
						}else{
							listRiserve.add(giocatore);
						}
					}
					
				}

				GiocatorePartitaLega separatore = createSepatator();
				list.addAll(listRiserve);
				gestioneSostituzioni(list);
				list.add(separatore);
				Collections.sort(list, new LineupCustomComparator());
				break;
			}
		}

		
		return list;
	}
	
	

	/**
	 * @param listCasa
	 */
	public void gestioneSostituzioni(ArrayList<GiocatorePartitaLega> listaGiocatori) {
		FantaserviceApp.nRiserve = 0;
		FantaserviceApp.nSostituzioni = 0;
		FantaserviceApp.sostituzioni = new HashMap<Integer, Character>();
		for (GiocatorePartitaLega giocatorePartitaLega : listaGiocatori) {
			if(Giocatore.TITOLARE == giocatorePartitaLega.getLineup() && giocatorePartitaLega.getPunteggio() == -1 && FantaserviceApp.partitaGiocata){
				giocatorePartitaLega.setSostituito(true);
				FantaserviceApp.nRiserve += 1;
				FantaserviceApp.sostituzioni.put(FantaserviceApp.nRiserve, giocatorePartitaLega.getRuolo());
			}
		}
		for (GiocatorePartitaLega giocatorePartitaLega : listaGiocatori) {
			if (Giocatore.RISERVA == giocatorePartitaLega.getLineup() && giocatorePartitaLega.getPunteggio() > -1 && FantaserviceApp.partitaGiocata) {
				if (FantaserviceApp.nSostituzioni < FantaserviceApp.nRiserve && FantaserviceApp.nSostituzioni < MAX_SOSTITUZIONI) {
					for (int i = FantaserviceApp.nSostituzioni; i < FantaserviceApp.nRiserve; i++) {
						if (FantaserviceApp.sostituzioni.get(i + 1) != null && giocatorePartitaLega.getRuolo() == FantaserviceApp.sostituzioni.get(i + 1).charValue()) {
							giocatorePartitaLega.setIngresso(true);
							break;
						}
					}
				}
			}

		}
	}
	
	public void onResume() {
		super.onResume();
		if(getView()!= null){
			if(FantaserviceApp.giocatorePartitaLega != null && FantaserviceApp.giocatorePartitaLega.size()>0){
				updateData(getView());
				adapter.notifyDataSetChanged();
			}
		}
	}
	
	public void update() {
		// super.onResume();
		if(getView()!= null){
			if(FantaserviceApp.giocatorePartitaLega != null && FantaserviceApp.giocatorePartitaLega.size()>0){
				updateData(getView());
				adapter.notifyDataSetChanged();
			}
		}
	}

	/**
	 * @return
	 */
	private GiocatorePartitaLega createSepatator() {
		GiocatorePartitaLega separatore = new GiocatorePartitaLega();
		separatore.setLineup('Q');
		separatore.setBonusmalus("00000000000");
		separatore.setCognome("Panchina");
		separatore.setNome("");
		separatore.setRuolo(' ');
		return separatore;
	}
	
	
	class FormazioneCustomComparator implements Comparator<GiocatorePartitaLega> {
	    @Override
	    public int compare(GiocatorePartitaLega o1, GiocatorePartitaLega                                                                                                                                                                                                                                                                                                                                                                 o2) {
	    	int retVal = new Integer(o1.getPosizione()).compareTo(new Integer(o2.getPosizione()));
	    	
	    			
	        return retVal;
	    }
	}
	
	class LineupCustomComparator implements Comparator<GiocatorePartitaLega> {
	    @Override
	    public int compare(GiocatorePartitaLega o1, GiocatorePartitaLega o2) {
	    	int retVal = -(new Character(o1.getLineup()).compareTo(new Character(o2.getLineup())));
	    	if (retVal == 0) {
	    		retVal = new Integer(o1.getPosizione()).compareTo(new Integer(o2.getPosizione()));
	        }
	    			
	        return retVal;
	    }
	}

	/**
	 * @return the trasferta
	 */
	public boolean isTrasferta() {
		return trasferta;
	}

	/**
	 * @param trasferta the trasferta to set
	 */
	public void setTrasferta(boolean trasferta) {
		this.trasferta = trasferta;
	}
	
	
}
